home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / ADP_0101.HAS next >
Text File  |  1996-11-18  |  7KB  |  247 lines

  1. *=======================================================
  2. *
  3. *    ADPCM->PCM 15.6kHz変換
  4. *
  5. *=======================================================
  6.  
  7. AtoP15n        macro        _X,_vol
  8.  
  9.         local        next
  10.  
  11.     .if    _X
  12.         cmpa.l        a3,a0            * トラップにかかった?
  13.         bcs        next
  14.         jsr        (a4)            * トラップ処理
  15.     .endif
  16. next:        moveq.l        #0,d0            * (4)
  17.         move.b        (a0)+,d0        * (8)
  18.         add.w        d0,d0            * (4)
  19.         adda.w        d0,a2            * (8)
  20.         add.w        (a2),d1            * (8)
  21.     .if    _vol=8
  22.         add.w        d1,(a1)+
  23.     .else
  24.         move.w        d1,d0            * (4)
  25.         VOLUME        _vol,d0,d2
  26.         add.w        d0,(a1)+
  27.     .endif
  28.         add.w        256*2(a2),d1        * (12)
  29.     .if    _vol=8
  30.         add.w        d1,(a1)+
  31.     .else
  32.         move.w        d1,d0            * (4)
  33.         VOLUME        _vol,d0,d2
  34.         add.w        d0,(a1)+
  35.     .endif
  36.         adda.w        256*2*2(a2),a2        * (16)
  37.  
  38.         endm
  39.  
  40. *=======================================================
  41.  
  42. AtoP_0101:
  43. AtoP_0203:
  44. AtoP_0102:
  45. AtoP_0103:
  46. AtoP_0104:
  47.         move.w        CH_VOL(a5),d5        * d5.w = ADPCM VOLUME
  48.  
  49.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  50.         bmi        AtoP_0101_keyoff
  51.         bne        AtoP_0101_keyon
  52.  
  53. *        通常の処理
  54.         move.w        CH_AtoP_Y(a5),d1    * d1.w = PCM予測値
  55.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = ADPCMアドレス
  56.         movea.l        CH_AtoP_X(a5),a2    * a2.l = ADPCM->PCM変換テーブルアドレス
  57.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = 変換中のトラップアドレス
  58.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  59.  
  60.         movea.l        CH_JMP_ADR2(a5),a6
  61.         jmp        (a6)
  62.  
  63. *        キーオンの処理
  64. AtoP_0101_keyon:
  65.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  66.  
  67.         moveq.l        #0,d1            * d1.w = PCM予測値
  68.         st.b        CH_ODDEVEN(a5)        * ODD/EVEN FLAG リセット
  69.         clr.w        CH_PITCH_CTR(a5)    * 音程カウンタクリア
  70.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = ADPCM先頭アドレス
  71.         movea.l        #AtoP_tbl,a2        * a2.l = 変換テーブル
  72.  
  73.         move.l        CH_LPTIME(a5),d7    * ループ処理をするか?
  74.         moveq.l        #1,d2
  75.         cmp.l        d2,d7            * cmpi.l より4clk速い
  76.         beq        1f
  77.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  78.         movea.l        CH_LPSTART_ADR(a5),a3    * a3.l = ループスタートアドレス
  79.         lea.l        AtoP_LOOP,a4        * a4.l = ループスタート処理アドレス
  80.         move.l        a3,CH_TRAP_ADR(a5)
  81.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  82.  
  83.         movea.l        CH_JMP_ADR2(a5),a6
  84.         jmp        (a6)
  85.  
  86. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = ADPCMデータ終了アドレス
  87.         lea.l        AtoP_END,a4        * a4.l = データ終了処理アドレス
  88.         move.l        a3,CH_TRAP_ADR(a5)
  89.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  90.  
  91.         movea.l        CH_JMP_ADR2(a5),a6
  92.         jmp        (a6)
  93.  
  94. *        キーオフの処理
  95. AtoP_0101_keyoff:
  96.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  97.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  98.         jmp        make_keyoff_PCM        * 消音PCM展開
  99.  
  100. *=======================================================
  101.  
  102. AtoP_0101_mac    macro        _vol
  103.  
  104.         local        ADPCM_odd
  105.  
  106.         tst.b        CH_ODDEVEN(a5)        * ODD/EVEN FLAG    のチェック
  107.         bpl        ADPCM_odd        * 変換が1ADPCMずれる場合
  108.  
  109. *        前が奇数番目のADPCMを処理していた場合
  110.         moveq.l        #MIX_SIZE-1,d2        * (4) 今回の処理中になんらかの
  111.         add.l        a0,d2            * (8) トラップが発生するか調べる
  112.         cmp.l        a3,d2            * (6)
  113.         bcs        @f            * (10)
  114.  
  115. *        トラップ判定あり
  116.         moveq.l        #MIX_SIZE-1,d6        * ADPCM -> PCM 変換
  117. 1:        AtoP15n        1,_vol
  118.         dbra        d6,1b
  119.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  120.     .if    _vol=8
  121.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  122.     .else
  123.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  124.     .endif
  125.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  126.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  127.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  128.         rts
  129.  
  130. *        トラップ判定無し
  131. @@:        moveq.l        #MIX_SIZE-1,d6        * ADPCM -> PCM 変換
  132. 1:        AtoP15n        0,_vol
  133.         dbra        d6,1b
  134.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  135.     .if    _vol=8
  136.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  137.     .else
  138.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  139.     .endif
  140.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  141.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  142.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  143.         rts
  144.  
  145. *        前が偶数番目のADPCMを処理していた場合
  146. ADPCM_odd:    moveq.l        #MIX_SIZE-1,d2        * (4) 今回の処理中になんらかの
  147.         add.l        a0,d2            * (8) トラップが発生するか調べる
  148.         cmp.l        a3,d2            * (6)
  149.         bcs        @f            * (10)
  150.  
  151. *        トラップ判定あり
  152.     .if    _vol=8
  153.         add.w        d1,(a1)+
  154.     .else
  155.         move.w        d1,d0
  156.         VOLUME        _vol,d0,d2
  157.         add.w        d0,(a1)+
  158.     .endif
  159.         moveq.l        #MIX_SIZE-1-1,d6    * ADPCM -> PCM 変換
  160. 1:        AtoP15n        1,_vol
  161.         dbra        d6,1b
  162.                             * ラストの1回
  163.         cmpa.l        a3,a0            * トラップにかかった?
  164.         bcs        1f
  165.         jsr        (a4)            * トラップ処理
  166. 1:        moveq.l        #0,d0            * (4)
  167.         move.b        (a0)+,d0        * (8)
  168.         add.w        d0,d0            * (4)
  169.         adda.w        d0,a2            * (8)
  170.         add.w        (a2),d1            * (8)
  171.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  172.     .if    _vol=8
  173.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  174.         add.w        d1,(a1)+
  175.     .else
  176.         move.w        d1,d0            * (4)
  177.         VOLUME        _vol,d0,d2
  178.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  179.         add.w        d0,(a1)+
  180.     .endif
  181.         add.w        256*2(a2),d1        * (12)
  182.         adda.w        256*2*2(a2),a2        * (16)
  183.  
  184.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  185.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  186.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  187.         rts
  188.  
  189. *        トラップ判定無し
  190. @@:
  191.     .if    _vol=8
  192.         add.w        d1,(a1)+
  193.     .else
  194.         move.w        d1,d0
  195.         VOLUME        _vol,d0,d2
  196.         add.w        d0,(a1)+
  197.     .endif
  198.         moveq.l        #MIX_SIZE-1-1,d6    * ADPCM -> PCM 変換
  199. 1:        AtoP15n        0,_vol
  200.         dbra        d6,1b
  201.                             * ラストの1回
  202.         moveq.l        #0,d0            * (4)
  203.         move.b        (a0)+,d0        * (8)
  204.         add.w        d0,d0            * (4)
  205.         adda.w        d0,a2            * (8)
  206.         add.w        (a2),d1            * (8)
  207.         move.w        d1,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d1.w
  208.     .if    _vol=8
  209.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  210.         add.w        d1,(a1)+
  211.     .else
  212.         move.w        d1,d0            * (4)
  213.         VOLUME        _vol,d0,d2
  214.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  215.         add.w        d0,(a1)+
  216.     .endif
  217.         add.w        256*2(a2),d1        * (12)
  218.         adda.w        256*2*2(a2),a2        * (16)
  219.  
  220.         move.w        d1,CH_AtoP_Y(a5)    * PCM予測値 = d1.w
  221.         move.l        a0,CH_PCM_ADR(a5)    * ADPCMアドレス = a0.l
  222.         move.l        a2,CH_AtoP_X(a5)    * ADPCM->PCM変換テーブルアドレス = a2.l
  223.         rts
  224.  
  225.         endm
  226.  
  227. *=======================================================
  228.  
  229. AtoP_0101_v00:    AtoP_0101_mac    0
  230. AtoP_0101_v01:    AtoP_0101_mac    1
  231. AtoP_0101_v02:    AtoP_0101_mac    2
  232. AtoP_0101_v03:    AtoP_0101_mac    3
  233. AtoP_0101_v04:    AtoP_0101_mac    4
  234. AtoP_0101_v05:    AtoP_0101_mac    5
  235. AtoP_0101_v06:    AtoP_0101_mac    6
  236. AtoP_0101_v07:    AtoP_0101_mac    7
  237. AtoP_0101_v08:    AtoP_0101_mac    8
  238. AtoP_0101_v09:    AtoP_0101_mac    9
  239. AtoP_0101_v10:    AtoP_0101_mac    10
  240. AtoP_0101_v11:    AtoP_0101_mac    11
  241. AtoP_0101_v12:    AtoP_0101_mac    12
  242. AtoP_0101_v13:    AtoP_0101_mac    13
  243. AtoP_0101_v14:    AtoP_0101_mac    14
  244. AtoP_0101_v15:    AtoP_0101_mac    15
  245. AtoP_0101_vnn:    AtoP_0101_mac    'n'
  246. AtoP_0101_non:    AtoP_0101_mac    'x'
  247.